# -*- Python -*- vim: set ft=python ts=4 sw=4 expandtab tw=79:
# Configuration file for the 'lit' test runner.

import os
import lit.formats

# Tell pylint that we know config and lit_config exist somewhere.
if 'PYLINT_IMPORT' in os.environ:
    config = object()
    lit_config = object()

# Use the CUDA device as suggested by the env
if 'CUDA_VISIBLE_DEVICES' in os.environ:
    config.environment['CUDA_VISIBLE_DEVICES'] = os.environ['CUDA_VISIBLE_DEVICES']

# Allow running the tests with omptarget debug output
if 'LIBOMPTARGET_DEBUG' in os.environ:
    config.environment['LIBOMPTARGET_DEBUG'] = os.environ['LIBOMPTARGET_DEBUG']

def append_dynamic_library_path(name, value, sep):
    if name in config.environment:
        config.environment[name] = value + sep + config.environment[name]
    else:
        config.environment[name] = value

# name: The name of this test suite.
config.name = 'libomptarget :: ' + config.libomptarget_current_target

# suffixes: A list of file extensions to treat as test files.
config.suffixes = ['.c', '.cpp', '.cc']

# test_source_root: The root path where tests are located.
config.test_source_root = os.path.dirname(__file__)

# test_exec_root: The root object directory where output is placed
config.test_exec_root = config.libomptarget_obj_root

# test format
config.test_format = lit.formats.ShTest()

# compiler flags
config.test_flags = " -I " + config.test_source_root + \
    " -I " + config.omp_header_directory + \
    " -L " + config.library_dir;

if config.omp_host_rtl_directory:
    config.test_flags = config.test_flags + " -L " + \
        config.omp_host_rtl_directory

config.test_flags = config.test_flags + " " + config.test_extra_flags

# Allow REQUIRES / UNSUPPORTED / XFAIL to work
config.target_triple = [ ]
for feature in config.test_compiler_features:
    config.available_features.add(feature)

if config.libomptarget_debug:
  config.available_features.add('libomptarget-debug')

config.available_features.add(config.libomptarget_current_target)

# Determine whether the test system supports unified memory.
# For CUDA, this is the case with compute capability 70 (Volta) or higher.
# For all other targets, we currently assume it is.
supports_unified_shared_memory = True
if config.libomptarget_current_target.startswith('nvptx'):
  try:
    cuda_arch = int(config.cuda_test_arch)
    if cuda_arch < 70:
      supports_unified_shared_memory = False
  except ValueError:
    # If the architecture is invalid, assume it is supported.
    supports_unified_shared_memory = True
if supports_unified_shared_memory:
   config.available_features.add('unified_shared_memory')

# Setup environment to find dynamic library at runtime
if config.operating_system == 'Windows':
    append_dynamic_library_path('PATH', config.library_dir, ";")
    append_dynamic_library_path('PATH', config.omp_host_rtl_directory, ";")
elif config.operating_system == 'Darwin':
    append_dynamic_library_path('DYLD_LIBRARY_PATH', config.library_dir, ":")
    append_dynamic_library_path('DYLD_LIBRARY_PATH', \
        config.omp_host_rtl_directory, ";")
    config.test_flags += " -Wl,-rpath," + config.library_dir
    config.test_flags += " -Wl,-rpath," + config.omp_host_rtl_directory
else: # Unices
    append_dynamic_library_path('LD_LIBRARY_PATH', config.library_dir, ":")
    append_dynamic_library_path('LD_LIBRARY_PATH', \
        config.omp_host_rtl_directory, ":")
    if config.cuda_libdir:
        append_dynamic_library_path('LD_LIBRARY_PATH', config.cuda_libdir, ":")
    append_dynamic_library_path('LIBRARY_PATH', config.library_dir, ":")
    append_dynamic_library_path('LIBRARY_PATH', \
        config.omp_host_rtl_directory, ":")

# substitutions
# - for targets that exist in the system create the actual command.
# - for valid targets that do not exist in the system, return false, so that the
#   same test can be used for different targets.

# Scan all the valid targets.
for libomptarget_target in config.libomptarget_all_targets:
    # Is this target in the current system? If so create a compile, run and test
    # command. Otherwise create command that return false.
    if libomptarget_target == config.libomptarget_current_target:
        config.substitutions.append(("%libomptarget-compilexx-run-and-check-generic", 
            "%libomptarget-compilexx-run-and-check-" + libomptarget_target))
        config.substitutions.append(("%libomptarget-compile-run-and-check-generic",
            "%libomptarget-compile-run-and-check-" + libomptarget_target))
        config.substitutions.append(("%libomptarget-compilexx-and-run-generic",
            "%libomptarget-compilexx-and-run-" + libomptarget_target))
        config.substitutions.append(("%libomptarget-compile-and-run-generic",
            "%libomptarget-compile-and-run-" + libomptarget_target))
        config.substitutions.append(("%libomptarget-compilexx-generic",
            "%libomptarget-compilexx-" + libomptarget_target))
        config.substitutions.append(("%libomptarget-compile-generic",
            "%libomptarget-compile-" + libomptarget_target))
        config.substitutions.append(("%libomptarget-run-generic",
            "%libomptarget-run-" + libomptarget_target))
        config.substitutions.append(("%libomptarget-run-fail-generic",
            "%libomptarget-run-fail-" + libomptarget_target))
        config.substitutions.append(("%clangxx-generic",
            "%clangxx-" + libomptarget_target))
        config.substitutions.append(("%clang-generic",
            "%clang-" + libomptarget_target))
        config.substitutions.append(("%fcheck-generic",
            config.libomptarget_filecheck + " %s"))


        config.substitutions.append(("%libomptarget-compilexx-run-and-check-" + \
            libomptarget_target, \
            "%libomptarget-compilexx-and-run-" + libomptarget_target + \
            " | " + config.libomptarget_filecheck + " %s"))
        config.substitutions.append(("%libomptarget-compile-run-and-check-" + \
            libomptarget_target, \
            "%libomptarget-compile-and-run-" + libomptarget_target + \
            " | " + config.libomptarget_filecheck + " %s"))
        config.substitutions.append(("%libomptarget-compilexx-and-run-" + \
            libomptarget_target, \
            "%libomptarget-compilexx-" + libomptarget_target + " && " + \
            "%libomptarget-run-" + libomptarget_target))
        config.substitutions.append(("%libomptarget-compile-and-run-" + \
            libomptarget_target, \
            "%libomptarget-compile-" + libomptarget_target + " && " + \
            "%libomptarget-run-" + libomptarget_target))
        config.substitutions.append(("%libomptarget-compilexx-" + \
            libomptarget_target, \
            "%clangxx-" + libomptarget_target + " %s -o %t"))
        config.substitutions.append(("%libomptarget-compile-" + \
            libomptarget_target, \
            "%clang-" + libomptarget_target + " %s -o %t"))
        config.substitutions.append(("%libomptarget-run-" + \
            libomptarget_target, \
            "%t"))
        config.substitutions.append(("%libomptarget-run-fail-" + \
            libomptarget_target, \
            "%not --crash %t"))
        config.substitutions.append(("%clangxx-" + libomptarget_target, \
            "%clangxx %openmp_flags %cuda_flags %flags -fopenmp-targets=" + libomptarget_target))
        config.substitutions.append(("%clang-" + libomptarget_target, \
            "%clang %openmp_flags %cuda_flags %flags -fopenmp-targets=" + libomptarget_target))
        config.substitutions.append(("%fcheck-" + libomptarget_target, \
            config.libomptarget_filecheck + " %s"))
    else:
        config.substitutions.append(("%libomptarget-compile-run-and-check-" + \
            libomptarget_target, \
            "echo ignored-command"))
        config.substitutions.append(("%libomptarget-compilexx-run-and-check-" + \
            libomptarget_target, \
            "echo ignored-command"))
        config.substitutions.append(("%libomptarget-compile-and-run-" + \
            libomptarget_target, \
            "echo ignored-command"))
        config.substitutions.append(("%libomptarget-compilexx-and-run-" + \
            libomptarget_target, \
            "echo ignored-command"))
        config.substitutions.append(("%libomptarget-compilexx-" + \
            libomptarget_target, \
            "echo ignored-command"))
        config.substitutions.append(("%libomptarget-compile-" + \
            libomptarget_target, \
            "echo ignored-command"))
        config.substitutions.append(("%libomptarget-run-" + \
            libomptarget_target, \
            "echo ignored-command"))
        config.substitutions.append(("%libomptarget-run-fail-" + \
            libomptarget_target, \
            "echo ignored-command"))
        config.substitutions.append(("%clang-" + libomptarget_target, \
            "echo ignored-command"))
        config.substitutions.append(("%clangxx-" + libomptarget_target, \
            "echo ignored-command"))
        config.substitutions.append(("%fcheck-" + libomptarget_target, \
            "echo ignored-command"))

config.substitutions.append(("%clangxx", config.test_cxx_compiler))
config.substitutions.append(("%clang", config.test_c_compiler))
config.substitutions.append(("%openmp_flags", config.test_openmp_flags))
if config.libomptarget_current_target.startswith('nvptx') and config.cuda_path:
    config.substitutions.append(("%cuda_flags", "--cuda-path=" + config.cuda_path))
else:
    config.substitutions.append(("%cuda_flags", ""))
config.substitutions.append(("%flags", config.test_flags))
config.substitutions.append(("%not", config.libomptarget_not))
